TARGET=test
CROSS_COMPILE   ?= arm-none-eabi-
CC         		:= $(CROSS_COMPILE)gcc
CXX				:= $(CROSS_COMPILE)g++
OBJCOPY         := $(CROSS_COMPILE)objcopy
AS				:=$(CROSS_COMPILE)gcc -x assembler-with-cpp
RM=rm -f
CORE=4
CPUFLAGS=-mthumb -mcpu=cortex-m$(CORE) -mfloat-abi=hard -mfpu=fpv4-sp-d16
#头文件路径
INCFLAGS=-I$(PWD)/CORE -I$(PWD)/FWLIB/inc -I$(PWD)/USER -I$(PWD)/OS/kernel -I$(PWD)/OS/mutex
#链接指令
LDFLAGS = -T STM32F417IG_FLASH.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group --specs=nosys.specs
#添加头文件路径 表明使用标准外设驱动库
CFLAGS=$(INCFLAGS) -D STM32F40_41xxx -D USE_STDPERIPH_DRIVER -Wall -g
CXXFLAGS = -lstdc++ $(CFLAGS) -ggdb3 -fno-rtti -fno-exceptions
#烧录器配置文件路径
INTERRFACE_CFG=interface/stlink-v2.cfg
#目标芯片配置文件路径
TARGET_CFG=target/stm32f4x.cfg 
#当前路径
PWD=$(shell pwd)
 
#搜索启动文件 以及其他汇编文件
START_SRC=$(shell find ./ -name '*.s')
#定义目标集合，.s替换成.o文件
START_OBJ=$(START_SRC:%.s=%.o)
 
#搜索所有的.c和.cpp文件
C_SRC=$(shell find ./ -name '*.c')
CPP_SRC=$(shell find ./ -name '*.cpp')
#定义一个目标集合，把搜索到的.c和.cpp文件替换成.o文件
C_OBJ=$(C_SRC:%.c=%.o)
CPP_OBJ=$(CPP_SRC:%.cpp=%.o)

#链接 输出bin、hex
$(TARGET):$(START_OBJ) $(C_OBJ) $(CPP_OBJ)
	$(CC) $^ $(CPUFLAGS) $(LDFLAGS) $(CFLAGS) -o $(TARGET).elf
	$(OBJCOPY) $(TARGET).elf $(TARGET).bin
	$(OBJCOPY) $(TARGET).elf -Oihex $(TARGET).hex
 

#编译
$(START_OBJ):%.o:%.s
	$(AS) -c $^ $(CPUFLAGS) $(CFLAGS) -o $@
$(C_OBJ):%.o:%.c
	$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) -o $@
$(CPP_OBJ):%.o:%.cpp
	$(CXX) -c $^ $(CXXFLAGS) $(CPUFLAGS) -o $@
 
clean:
	$(RM) $(shell find ./ -name '*.o') $(TARGET).*
	
download:
	openocd -f $(INTERRFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c "flash write_image erase $(PWD)/$(TARGET).bin" -c reset -c shutdown
